/*
 * Функція пошуку елементу документу за id
 * Повний еквівалент виклику document.getElementById(id);
 * @param {type} id
 * @returns {Element}
 */
function byId(id) {
	return document.getElementById(id);
}

var D = document;

function getCaller(event) {
	event = event || window.event; // window.event для IE ниже 8 версии
	return event.target || event.srcElement; // srcElement для IE ниже 8 версии
}
/*
 * Функція для формування слухачів кліків.
 * TODO: Назначення кількох слухачів на один елемент.
 */
function addElementClickListenerById(id, listener) {
	if (listener instanceof Function) {
		clickListeners[clickListeners.length] =
				  new ClickListener(id, listener);
	} else {
		throw Error("ElementClickListener must be a function.");
	}
}

/*
 * Функція для формування слухачів submit-ів форм.
 * TODO: Назначення кількох слухачів на один елемент.
 */
function addFormSubmitListenerByName(name, listener) {
	if (listener instanceof Function) {
		formSubmitListeners[formSubmitListeners.length] =
				  new FormSubmitListener(name, listener);
	} else {
		throw Error("FormSubmitListener must be a function.");
	}
}

/*
 * Функція для формування слухачів завершення завантаження документу.
 */
function addDocumentLoadListener(listener) {
	if (listener instanceof Function) {
		loadListeners[loadListeners.length] = new LoadListener(listener);
	} else {
		throw Error("Document load listener must be a function.");
	}
}

window.onload = function init() {
	for (var i = 0; i < loadListeners.length; i++) {
		loadListeners[i].onLoad();
	}
	//TODO: Можливо необхідно чистити масив після назначення слухачів.
	for (var i = 0; i < clickListeners.length; i++) {
		byId(clickListeners[i].id).onclick =
				  clickListeners[i].onClick;
	}
	//TODO: Можливо необхідно чистити масив після назначення слухачів.
	for (var i = 0; i < formSubmitListeners.length; i++) {
		D.forms[formSubmitListeners[i].name].onsubmit =
				  formSubmitListeners[i].onSubmit;
	}
};

/*
 * Масив для збереження слухачів завершення завантаження документу.
 * @type Array
 */
var loadListeners = new Array();

/*
 * Масив для збереження слухачів кліків.
 * @type Array
 */
var clickListeners = new Array();


/*
 * Масив для збереження слухачів submit-ів.
 * @type Array
 */
var formSubmitListeners = new Array();

/*
 * Класс для представлення слухача кліка.
 */
function ClickListener(id, onclick) {
	this.onClick = onclick;
	this.id = id;
}

/*
 * Класс для представлення слухача submit.
 */
function FormSubmitListener(name, onsubmit) {
	this.onSubmit = onsubmit;
	this.name = name;
}

/*
 * Класс для представлення слухача завершення завантаження документу. 
 */
function LoadListener(onload) {
	this.onLoad = onload;
}